package org.nobject.common.lang;

import static org.nobject.common.lang.ClassUtils.isCollection;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.nobject.common.bean.BeanUtils;
import org.nobject.common.exception.ConvertException;
import org.nobject.common.js.JSONUtils;

/**
 * Collection工具类
 *
 * @author bianrongjun
 * @version 1.0
 */
public class CollectionUtils {
	
	/** 
	 * 附加数组
	 * @param collection 集合
	 * @param os 数组
	 */
	public static void addAll(Collection collection,Object[] os){
		for(Object o:os) collection.add(o);
	}
	
	/******************************************************************************************************************
	 * 
	 *  toCollection 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 
	 * 数组转换为Collection
	 * @param array 数组
	 */
	public static Collection toCollectionByArray(Object array){
		List list=new LinkedList();
		int l=Array.getLength(array);
		for (int i = 0; i < l; i++) list.add(Array.get(array, i));
		return list;
	}
	
	/** 
	 * 字符串转换为Collection,支持JSON格式的转换
	 * @param str
	 * @throws ConvertException
	 */
	public static Collection toCollection(String str) throws ConvertException{
		return JSONUtils.toList(str);
	}
	
	/** 
	 * 对象数组转换为Collection
	 * @param objs 对象数组
	 * @throws ConvertException 转换异常
	 */
	public static Collection toCollection(Object[] objs) throws ConvertException{
		return toCollection0(objs);
	}
	
	/** 
	 * 对象转换为Collection
	 * @param obj
	 * @throws ConvertException 转换异常
	 */
	public static Collection toCollection0(Object obj) throws ConvertException{
		if(obj==null) return null;
		Class c=obj.getClass();
		if(isCollection(c)) return (Collection)obj;
		if(c.isArray()){
			return toCollectionByArray(obj);
		}else if(ClassUtils.isString(c)){
			return toCollection((String)obj);
		}else{
			throw new ConvertException("不支持到Collection的转换:"+c.getName());
		}
	}
	
	/** 
	 * 获取对象
	 * @param o 容器对象
	 * @param idx 序号
	 */
	public static Object get(Collection o,int idx){
		int c=-1;
		for(Object oo:o) {c++;if(c==idx) return oo;}
		throw new ArrayIndexOutOfBoundsException();
	}
	
	/** 
	 * 抽取对象
	 * @param c 集合
	 * @param key 键值
	 * @param value 目标值
	 */
	public static Object fetch(Collection c,String key,Object value){
		for(Object o:c){
			Object kV=null;
			if(o instanceof Map){
				kV=((Map)o).get(key);
			}else{
				kV=BeanUtils.getProperty(o, key);
			}
			if(value.equals(kV)){
				return o;
			}
		}
		return null;
	}
	
	/** 
	 * isEmpty
	 * @param c
	 */
	public static boolean isEmpty(Collection c){
		return c==null||c.size()==0;
	}
	
	public static void main(String[] args) {
		Set s=new LinkedHashSet();
		s.add("SS1");
		s.add("SS2");
		s.add("SS3");
		s.add("SS4");
		System.out.println(get(s,9));
	}
}
